# -*- coding: utf-8 -*-
"""
用于读取的组件
"""

import os
import re
import time
import random
import ppc.pipe
import ppc.task
import ppc.extensions.url


class ListController(ppc.pipe.Pipe):
    """
    列表控制器
    循环传递每一项item中的数值
    """
    def handle(self):
        items = self['item'] if isinstance(self['item'], list) else [self['item']]

        for item in items:
            self.transfer(item)

            # 是否循环中止
            if self.flag == ppc.pipe.Flag.Break:
                self.flag = ppc.pipe.Flag.Normal
                break


class SleepController(ppc.pipe.Pipe):
    """
    休眠暂停控制器
    传递到此处暂停某些时间
    """
    def handle(self):
        interval = self['interval'].value
        if re.match('^\d+$', interval):
            interval = int(interval)
        elif re.match('^\d+\-\d+$', interval):
            min, max = [int(d) for d in interval.split('-')]
            if min > max:
                min, max = max, min
            interval = random.randint(min, max)
        else:
            interval = 0

        interval *= ppc.SECONDS_NUM[self['unit'].value]
        if interval > 0:
            time.sleep(interval)

        self.transfer(self.input)


class BreakController(ppc.pipe.Pipe):
    """
    循环跳出控制器
    
    在某些管道组件(Pipe)中的handle方法中，带有循环操作，
    在达到某种条件的情况下，不需要(或者不能够)继续循环，就需要
    在后继的管道中进行控制以结束循环。
    """
    def handle(self):
        pipeid = self['pipeid'].value
        
        if re.match('^(\w+)(\,\w+)+$', pipeid):
            list_ = pipeid.split(',')
            for id in list_:
                ppc.task.Task.instance.pipes[id].flag = ppc.pipe.Flag.Break

        self.transfer(self.input)

